import base64
import json
import os
import re
from io import BytesIO
from os import path

from scrapy import Request
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline


class DownImgPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        # 下载图片，如果传过来的是集合需要循环下载
        # meta里面的数据是从spider获取，然后通过meta传递给下面方法：file_path
        yield Request(url=item['imgurl'], meta={'name': item['username']})

    def item_completed(self, results, item, info):
        # 是一个元组，第一个元素是布尔值表示是否成功
        if not results[0][0]:
            raise DropItem('下载失败')

        return item

        # 重命名，若不重写这函数，图片名为哈希，就是一串乱七八糟的名字

    def file_path(self, request, response=None, info=None):
        # 接收上面meta传递过来的图片名称
        name = request.meta['name']
        # 提取图片后缀
        img_ex = request.url.split('.')[-1]
        # 提取图片名字，用于避免重命名使用
        img_name = request.url.split('/')[-1].split('.')[0]
        # 清洗Windows系统的文件夹非法字符，避免无法创建目录
        folder_strip = re.sub(r'[？\\*|“<>:/]', '', str(name))
        # 分文件夹存储的关键：{0}对应着name；{1}对应着image_guid
        filename = folder_strip + '_' + img_name + '.' + img_ex
        return filename
